package com.shujia.wyh.day14;

import java.lang.reflect.Constructor;

/*
    一个标准的类包含三种成员：
        构造方法
        成员变量
        成员方法
 */
public class ClassDemo2 {
    public static void main(String[] args) throws Exception {
        //如何通过反射获取一个类种的任意构造方法并创建对象
        //1、获取一个类的Class文件对象
        Class<?> studentClass = Class.forName("com.shujia.wyh.day14.Student");

        //Constructor<T> getConstructor(Class<?>... parameterTypes)
        //返回一个 Constructor对象，该对象反映 Constructor对象表示的类的指定的公共 类函数。
        //获取Student类中无参构造方法
//        Constructor<?> c1 = studentClass.getConstructor();
//        System.out.println(c1);

        //Constructor<?>[] getConstructors()
        //返回包含一个数组 Constructor对象反射由此表示的类的所有公共构造 类对象。
//        Constructor<?>[] constructors = studentClass.getConstructors();
//        for (Constructor<?> constructor : constructors) {
//            System.out.println(constructor);
//        }

        //getConstructor只能获取对应的被public修饰的构造方法
        //如果想要获取私有的构造方法，请使用另外一种方法进行获取
//        Constructor<?> c1 = studentClass.getConstructor();
//        System.out.println(c1);
        //Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
        //返回一个 Constructor对象，该对象反映 Constructor对象表示的类或接口的指定 类函数。
//        Constructor<?> c1 = studentClass.getDeclaredConstructor();
//        System.out.println(c1);

        //private Student(String name, int age)
        Constructor<?> c2 = studentClass.getDeclaredConstructor(String.class, int.class);
        System.out.println(c2);

        //如何通过获取到的构造方法进行创建对象呢？
        //T newInstance(Object... initargs)
        //使用此 Constructor对象表示的构造函数，使用指定的初始化参数来创建和初始化构造函数的声明类的新实例。
//        Object o1 = c1.newInstance();
//        System.out.println(o1);
//
//        Object o2 = c1.newInstance();
//        System.out.println(o2);
//        System.out.println(o1==o2);
        //打破语法检查，暴力访问
        c2.setAccessible(true);
        Object o3 = c2.newInstance("小虎", 18);
        System.out.println(o3);


    }
}
